package cn.xshi.oauth.service.impl;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import cn.hutool.core.collection.CollectionUtil;
import cn.xshi.common.base.BaseResult;
import cn.xshi.common.cache.redis.RedisUtil;
import cn.xshi.common.constant.CacheConstant;
import cn.xshi.common.session.HttpSessionUtils;
import cn.xshi.common.util.JsonUtil;
import cn.xshi.common.util.StringUtil;
import cn.xshi.common.util.file.FileUtil;
import cn.xshi.oauth.dao.*;
import cn.xshi.oauth.dto.OauthSysModeDTO;
import cn.xshi.oauth.form.*;
import cn.xshi.oauth.model.*;
import cn.xshi.oauth.param.OauthAccountTenantParam;
import cn.xshi.oauth.service.OauthAccountTenantService;
import cn.xshi.oauth.service.OauthSysModeService;
import cn.xshi.common.base.BaseService;
import cn.xshi.common.util.ExceptionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Desc 授权中心子系统标记
 * @Author 邓纯杰
 * @CreateTime 2012-12-12 12:12:12
 */
@Service
@Slf4j
public class OauthSysModeServiceImpl extends BaseService implements OauthSysModeService {

	@Resource
	private OauthSysModeDao oauthSysModeDao;

	@Resource
	private RedisUtil redisUtil;

	@Resource
	HttpSessionUtils httpSessionUtils;

	@Resource
	OauthAccountTenantService oauthAccountTenantService;

	@Resource
	OauthSysModulesDao oauthSysModulesDao;

	@Resource
	OauthResourcesDao oauthResourcesDao;

	@Resource
	OauthFunctionInfoDao oauthFunctionInfoDao;

	@Resource
	OauthAccountTypeDao oauthAccountTypeDao;

	/**
	 * 分页
	 * @param oauthSysModeForm
	 * @return
	 */
	public List<OauthSysMode> getOauthSysModeListByCondition(OauthSysModeForm oauthSysModeForm){
		try{
			return oauthSysModeDao.getOauthSysModeListByCondition(oauthSysModeForm);
		} catch (Exception e) {
			throw new ExceptionUtil(e.getMessage(),e.getCause());
		}
	}

	/**
	 * 查询对象
	 * @param id
	 * @return
	 */
	public OauthSysMode getOauthSysModeById(String id){
		try{
			OauthSysMode oauthSysMode = oauthSysModeDao.getOauthSysModeById(id);
			return oauthSysMode;
		} catch (Exception e) {
			throw new ExceptionUtil(e.getMessage(),e.getCause());
		}
	}

	/**
	 * 添加
	 * @param oauthSysMode
	 * @return
	 */
	public int addOauthSysMode(OauthSysMode oauthSysMode){
		int i = 0;
		try {
			oauthSysMode.setCreateTime(getDate());
			oauthSysMode.setCreateId(getCurrentAccountId());
			if(!StringUtil.isEmpty(oauthSysMode.getKeyInfoId())){
				OauthSysModeForm oauthSysModeForm = new OauthSysModeForm();
				oauthSysModeForm.setKeyInfoId(oauthSysMode.getKeyInfoId());
				if(!oauthSysModeDao.getOauthSysModeListByCondition(oauthSysModeForm).isEmpty()){
					throw new ExceptionUtil("秘钥已被其他产品线使用");
				}
			}
			i = oauthSysModeDao.addOauthSysMode(oauthSysMode);
			sync();
		} catch (Exception e) {
			throw new ExceptionUtil(e.getMessage(),e.getCause());
		}
		return i;
	}

	/**
	 * 修改
	 * @param oauthSysMode
	 * @return
	 */
	public int updateOauthSysMode(OauthSysMode oauthSysMode){
		int i = 0;
		try {
			oauthSysMode.setUpdateId(getCurrentAccountId());
			oauthSysMode.setUpdateTime(getDate());
			String oldKeyInfoId = oauthSysModeDao.getOauthSysModeById(oauthSysMode.getId()).getKeyInfoId();
			if(!StringUtil.isEmpty(oauthSysMode.getKeyInfoId()) && !oauthSysMode.getKeyInfoId().equals(oldKeyInfoId)){
				OauthSysModeForm oauthSysModeForm = new OauthSysModeForm();
				oauthSysModeForm.setKeyInfoId(oauthSysMode.getKeyInfoId());
				if(!oauthSysModeDao.getOauthSysModeListByCondition(oauthSysModeForm).isEmpty()){
					throw new ExceptionUtil("秘钥已被其他产品线使用");
				}
			}
			i = oauthSysModeDao.updateOauthSysMode(oauthSysMode);
			sync();
		} catch (Exception e) {
			throw new ExceptionUtil(e.getMessage(),e.getCause());
		}
		return i;
	}

	/**
	 * 删除
	 * @param condition
	 * @return
	 */
	public int delOauthSysMode(Map<String,Object> condition){
		int i = 0;
		try {
			i = oauthSysModeDao.delOauthSysMode(condition);
			OauthAccountTenantParam oauthAccountTenantParam = new OauthAccountTenantParam();
			oauthAccountTenantParam.setBatchSysModeId((String[]) condition.get("id"));
			oauthAccountTenantService.delOauthAccountTenantBySysModeId(oauthAccountTenantParam);
			sync();
		} catch (Exception e) {
			throw new ExceptionUtil(e.getMessage(),e.getCause());
		}
		return i;
	}

	/**
	 * 获取SysModeId
	 * @param request
	 * @return
	 */
	public String getSysModeId(HttpServletRequest request){
		String key = null;
		String pass = null;
		Enumeration<String> headerNames = request.getHeaderNames();
		while (headerNames.hasMoreElements()) {
			String k = (String) headerNames.nextElement();
			if(k.toLowerCase().equals(CacheConstant.JEHC_CLOUD_KEY.toLowerCase())){
				key = request.getHeader(k);
			}
			if(k.toLowerCase().equals(CacheConstant.JEHC_CLOUD_SECURITY.toLowerCase())){
				pass = request.getHeader(k);
			}
		}
		if(StringUtil.isEmpty(key)){
			return null;
		}
		if(StringUtil.isEmpty(pass)){
			return null;
		}
		String oauthKeyInfoJson = httpSessionUtils.getHashAttribute(CacheConstant.OAUTH_KEY,key);
		OauthKeyInfo oauthKeyInfo = JsonUtil.fromFJson(oauthKeyInfoJson,OauthKeyInfo.class);
		String appSecret = oauthKeyInfo.getAppSecret();
		if(StringUtil.isEmpty(appSecret)){
			return null;
		}
		if(!pass.equals(appSecret)){
			return null;
		}

		String oauthSysModeJson = httpSessionUtils.getAttribute(CacheConstant.OAUTH_SYS_MODE);
		if(StringUtil.isEmpty(oauthSysModeJson)){
			return null;
		}
		List<OauthSysMode> oauthSysModeList = JsonUtil.toFList(oauthSysModeJson,OauthSysMode.class);
		for(OauthSysMode oauthSysMode:oauthSysModeList){
			if(oauthKeyInfo.getId().equals(oauthSysMode.getKeyInfoId())){
				return oauthSysMode.getId();
			}
		}
		return null;
	}

	/**
	 * 同步缓存
	 * @return
	 */
	public boolean sync(){
		try {
			OauthSysModeForm oauthSysModeForm = new OauthSysModeForm();
			List<OauthSysMode> oauthSysModeList = getOauthSysModeListByCondition(oauthSysModeForm);
			redisUtil.set(CacheConstant.OAUTH_SYS_MODE,JsonUtil.toFastJson(oauthSysModeList));
			return true;
		}catch (Exception e){
			log.info("同步授权中心子系统缓存失败，错误信息：{}",e);
			return false;
		}
	}

	/**
	 * 导出子系统
	 * @param response
	 * @param id
	 */
	public void exportOauthSysMode(HttpServletResponse response, String id){
		if(StringUtil.isEmpty(id)){
			log.info("子系统id为空",id);
			throw new ExceptionUtil("子系统id为空");
		}

		//1.取出子系统数据库数据
		OauthSysMode oauthSysMode = oauthSysModeDao.getOauthSysModeById(id);
		if(null == oauthSysMode){
			log.info("子系统不存在",id);
			throw new ExceptionUtil("子系统不存在");
		}
		OauthSysModeDTO oauthSysModeDTO = new OauthSysModeDTO();
		oauthSysModeDTO.setOauthSysMode(oauthSysMode);

		//2.取出子系统模块数据库数据
		OauthSysModulesForm oauthSysModulesForm = new OauthSysModulesForm();
		oauthSysModulesForm.setSysModeId(id);
		List<OauthSysModules> oauthSysModulesList = oauthSysModulesDao.getOauthSysModulesListByCondition(oauthSysModulesForm);
		if(CollectionUtil.isNotEmpty(oauthSysModulesList)){
			oauthSysModeDTO.setOauthSysModules(oauthSysModulesList);
		}

		//3.取出资源（菜单）数据库数据
		OauthResourcesForm oauthResourcesForm = new OauthResourcesForm();
		oauthResourcesForm.setSysModeId(id);
		List<OauthResources> oauthResourcesList = oauthResourcesDao.queryOauthResourcesList(oauthResourcesForm);
		if(CollectionUtil.isNotEmpty(oauthResourcesList)){
			oauthSysModeDTO.setOauthResourcesList(oauthResourcesList);
		}

		//4.取出功能数据库数据
		OauthFunctionInfoForm oauthFunctionInfoForm = new OauthFunctionInfoForm();
		oauthFunctionInfoForm.setSysModeId(id);
		List<OauthFunctionInfo> oauthFunctionInfoList = oauthFunctionInfoDao.queryOauthFunctionInfoList(oauthFunctionInfoForm);
		if(CollectionUtil.isNotEmpty(oauthFunctionInfoList)){
			oauthSysModeDTO.setOauthFunctionInfoList(oauthFunctionInfoList);
		}

		//5.取出账户类型数据库数据
		OauthAccountTypeForm oauthAccountTypeForm = new OauthAccountTypeForm();
		oauthAccountTypeForm.setSysModeId(id);
		List<OauthAccountType> oauthAccountTypeList = oauthAccountTypeDao.getOauthAccountTypeList(oauthAccountTypeForm);
		if(CollectionUtil.isNotEmpty(oauthAccountTypeList)){
			oauthSysModeDTO.setOauthAccountTypeList(oauthAccountTypeList);
		}

		//执行导出
		String json = JsonUtil.toFastJson(oauthSysModeDTO);
		FileUtil.exportJsonFile(response,json,"-"+oauthSysModeDTO.getOauthSysMode().getName()+".json");
	}

	/**
	 * 导入子系统
	 * @param request
	 * @param response
	 * @param multipartFile
	 * @return
	 */
	public BaseResult importOauthSysMode(HttpServletRequest request, HttpServletResponse response, MultipartFile multipartFile){
		try {

			String jsonText = FileUtil.readJson(multipartFile);
			if(StringUtil.isEmpty(jsonText)){
				return BaseResult.fail("导入内容为空！");
			}
			OauthSysModeDTO oauthSysModeDTO = JsonUtil.fromAliFastJson(jsonText,OauthSysModeDTO.class);
			if(null == oauthSysModeDTO){
				return BaseResult.fail("未能解析到信息！");
			}
			if(null == oauthSysModeDTO.getOauthSysMode()){
				return BaseResult.fail("未能解析到子系统！");
			}

			//1.处理子系统
			OauthSysMode oauthSysMode = oauthSysModeDTO.getOauthSysMode();
			if(null != oauthSysMode){
				OauthSysMode sysMode = oauthSysModeDao.getOauthSysModeById(oauthSysMode.getId());
				if(null == sysMode){
					addOauthSysMode(oauthSysMode);
				}else{
					updateOauthSysMode(oauthSysMode);
				}
			}

			//2.处理资源
			List<OauthResources> oauthResourcesList = oauthSysModeDTO.getOauthResourcesList();
			if(CollectionUtil.isNotEmpty(oauthResourcesList)){
				for(OauthResources oauthResources: oauthResourcesList){
					OauthResources resources = oauthResourcesDao.getOauthResourcesById(oauthResources.getId());
					if(null != resources){
						oauthResourcesDao.updateOauthResourcesBySelective(oauthResources);
					}else{
						oauthResourcesDao.addOauthResources(oauthResources);
					}
				}
			}

			//3.处理功能
			List<OauthFunctionInfo> oauthFunctionInfoList = oauthSysModeDTO.getOauthFunctionInfoList();
			if(CollectionUtil.isNotEmpty(oauthFunctionInfoList)){
				for(OauthFunctionInfo oauthFunctionInfo: oauthFunctionInfoList){
					OauthFunctionInfo functionInfo = oauthFunctionInfoDao.getOauthFunctionInfoById(oauthFunctionInfo.getId());
					if(null != functionInfo){
						oauthFunctionInfoDao.updateOauthFunctionInfoBySelective(oauthFunctionInfo);
					}else{
						oauthFunctionInfoDao.addOauthFunctionInfo(oauthFunctionInfo);
					}
				}
			}

			//4.处理账户类型
			List<OauthAccountType> oauthAccountTypeList =  oauthSysModeDTO.getOauthAccountTypeList();
			if(CollectionUtil.isNotEmpty(oauthAccountTypeList)){
				for(OauthAccountType oauthAccountType:oauthAccountTypeList){
					OauthAccountType accountType =  oauthAccountTypeDao.getOauthAccountTypeById(oauthAccountType.getId());
					if(null != accountType){
						oauthAccountTypeDao.updateOauthAccountType(oauthAccountType);
					}else{
						oauthAccountTypeDao.addOauthAccountType(oauthAccountType);
					}
				}
			}

			//5.处理子系统模块
			List<OauthSysModules> oauthSysModulesList = oauthSysModeDTO.getOauthSysModules();
			if(CollectionUtil.isNotEmpty(oauthSysModulesList)){
				for(OauthSysModules oauthSysModules: oauthSysModulesList){
					OauthSysModules sysModules = oauthSysModulesDao.getOauthSysModulesById(oauthSysModules.getId());
					if(null != sysModules){
						oauthSysModulesDao.updateOauthSysModulesBySelective(oauthSysModules);
					}else{
						oauthSysModulesDao.addOauthSysModules(oauthSysModules);
					}
				}
			}
		}catch (Exception e){
			log.error("导入子系统数据库数据异常",e);
			throw new ExceptionUtil("导入子系统数据库数据异常");
		}
		return BaseResult.success();
	}
}